package com.wooophone.buyi.dao;

import java.util.List;

import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;

/**
 * @author MingliC
 * 
 * @param <T>
 *            操作的对象
 */
public interface BaseDao<T> {
	/**
	 * 保存对象
	 * 
	 * @param obj
	 *            要保存的对象
	 * @return
	 */
	void save(T obj);

	/**
	 * 更新对象
	 * 
	 * @param obj
	 *            要保存的对象
	 * @return
	 */
	void update(T obj);

	/**
	 * 删除对象
	 * 
	 * @param id
	 *            对象的ID
	 * @return
	 */
	void delete(Object id);

	/**
	 * 获得所有数据
	 * 
	 * @return
	 */
	List<T> list();

	/**
	 * 获得所有数据
	 * 
	 * @return
	 */
	List<T> listByLimit(int pageNo, int pageSize);

	/**
	 * 获得总记录数 ，没有参数
	 * 
	 * @return
	 */
	long count();

	/**
	 * 作IS查询
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	T isResult(String key, Object value);

	/**
	 * 作IS查询，并进行筛选
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	T isResultInclude(String key, Object value, String... fields);

	/**
	 * 作IS查询，并进行排除
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	T isResultExclude(String key, Object value, String... excludes);

	/**
	 * 作IS查询,得到列表
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	List<T> isResults(String key, Object value);

	/**
	 * 作IS查询,得到列表，并进行筛选
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	List<T> isResultsInclude(String key, Object value, String... fields);

	/**
	 * 指定Key-value进行查询，并进行排除
	 * 
	 * @param key
	 * @param value
	 * @param fields
	 * @return
	 */
	List<T> isResultsExclude(String key, Object value, String... excludes);

	/**
	 * 查询是否存在
	 * 
	 * @param id
	 * @return
	 */
	boolean exist(Object id);

	/**
	 * 查询是否存在
	 * 
	 * @param query
	 * @return
	 */
	boolean exist(Query query);

	/**
	 * 指定ID获得对象
	 * 
	 * @param id
	 * @return
	 */
	T get(Object id);

	/**
	 * 指定ID获得对象
	 * 
	 * @param id
	 * @return
	 */
	T get(Object id, String... fields);

	/**
	 * 指定Query获得对象
	 * 
	 * @param id
	 * @return
	 */
	T get(Query query);

	/**
	 * 指定Query查看对象总数
	 * 
	 * @param id
	 * @return
	 */
	long count(Query query);

	/**
	 * 指定Query对得对象列表
	 * 
	 * @param id
	 * @return
	 */
	List<T> getList(Query query);

	/**
	 * 指定Query对得对象列表
	 * 
	 * @param id
	 * @return
	 */
	List<T> getListInclude(Query query, String... fields);

	/**
	 * 指定Query对得对象列表
	 * 
	 * @param id
	 * @return
	 */
	List<T> getListExclude(Query query, String... excludes);

	/**
	 * 得到 IS 查询条件
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	Criteria is(String key, Object value);

	/**
	 * 得到IS查询
	 * 
	 * @param key
	 * @param value
	 * @return
	 */
	Query isQuery(String key, Object value);
}
